home *** CD-ROM | disk | FTP | other *** search
/ BCI NET / BCI NET Dec 94.iso / archives / programming / utilities / bmfc000.lha / BMFC / BMFC.doc next >
Encoding:
Text File  |  1992-08-31  |  24.6 KB  |  632 lines

  1.   **************************************
  2.   * BMFC.doc                           *
  3.   * for BMFC 0.00                      *
  4.   * Copyright 1992 by Adam M. Costello *
  5.   **************************************
  6.  
  7.     BMFC 0.00 is a package containing:
  8.  
  9.       + This doc file.
  10.       + The C source for the program "bmfc".
  11.       + The BMF source for the fonts Lucid 10, 12, 13, and 15.
  12.  
  13.     BMFC 1.00 will also contain the source for the program "bmfd".
  14.  
  15.  
  16. TABLE OF CONTENTS
  17.  
  18.     TABLE OF CONTENTS
  19.     FILE LIST
  20.     LEGAL STUFF
  21.     RELEASE NOTES
  22.     DESCRIPTION
  23.     USAGE
  24.     ABOUT AMIGA BITMAP FONTS
  25.     SOURCE LANGUAGE
  26.       Basic Syntax
  27.       Instructions
  28.     TECHNICAL NOTES
  29.     BUGS
  30.  
  31.  
  32. FILE LIST
  33.  
  34.     The BMFC 0.00 package is always distributed with at least the following
  35.     files:
  36.  
  37.         BMFC.doc
  38.  
  39.         bmfc.c
  40.         build.h
  41.         build.c
  42.         parse.h
  43.         parse.c
  44.         error.h
  45.         error.c
  46.  
  47.         Lucid10.bmf
  48.         Lucid12.bmf
  49.         Lucid13.bmf
  50.         Lucid15.bmf
  51.  
  52.     Each file is a text file that identifies itself on its second line, and the
  53.     version of BMFC to which it belongs on the third line, so you can tell
  54.     which file is which even if your file system doesn't allow these filenames.
  55.  
  56.  
  57. LEGAL STUFF
  58.  
  59.     The files listed in the FILE LIST section above are each Copyright 1992 by
  60.     Adam M. Costello.
  61.  
  62.     I make no guarantees, and may not be held liable for any damage resulting
  63.     from the use of those files.
  64.  
  65.     I, Adam M. Costello, grant you, whoever you are, permission to use those
  66.     files in any way you wish, with the following two restrictions:
  67.  
  68.      1) You may not distribute modifications of any of the files.
  69.      2) Whenever you distribute any one of the files, it must be accompanied by
  70.         all the others.
  71.  
  72.     Of course, I cannot disallow the distribution of patches for the files, but
  73.     I would much prefer that you send me any suggestions for modifications, so
  74.     that I can incorporate them into a future version of BMFC.  See the BUGS
  75.     section for my addresses.
  76.  
  77.  
  78. RELEASE NOTES
  79.  
  80.     The changes between each released version of BMFC and the previous one are
  81.     described here.
  82.  
  83.     BMFC 0.00   released Sun 30 Aug 1992:
  84.         This is the first release.  It is premature; bmfc has not been
  85.         comprehensively tested, and bmfd has not even been written.  I release
  86.         this version only because I know there are a few people claiming to be
  87.         "desperate" for a font editor.  This is a compiler, not an editor, but
  88.         but it serves the same purpose.
  89.  
  90.  
  91. DESCRIPTION
  92.  
  93.     bmfc compiles a BMF source file into an Amiga bitmap font load file.  The
  94.         C source for bmfc is not Amiga specific; it may be compiled and run on
  95.         any machine which has an ANSI C compiler, assuming that fgetc() and
  96.         fputc() read and write files a byte at a time.  The load files which it
  97.         produces, however, are useful only on an Amiga.  No program is provided
  98.         for creating .font files, since the program FixFonts, which comes with
  99.         the operating system, does this.
  100.  
  101.     bmfd decompiles an Amiga bitmap font into a BMF source file.  The source
  102.         file, if compiled with bmfc, will produce a font which looks just like
  103.         the original.  The load file will almost certainly be different,
  104.         though, because many different load files can specify same-looking
  105.         fonts.  bmfdump is useful for creating fonts which are very similar to
  106.         existing fonts for which BMF source is unavailable.  bmfd is an Amiga
  107.         specific program, which requires the Amiga include files, amiga.lib,
  108.         and the Amiga shared libraries.
  109.  
  110.     Lucid 10, 12, 13, and 15 are fonts designed to replace Topaz, since they
  111.         have a similar style but are (in my opinion) much more readable.  They
  112.         are all non-proportional, non-color fonts with width 8.
  113.  
  114.  
  115. USAGE
  116.  
  117.     bmfc [-o <loadfile>] <sourcefile>
  118.  
  119.         <loadfile>   is the name of the load file to be created (or
  120.                      overwritten).  If the -o option is not supplied, the file
  121.                      created will have as its name the decimal numeral for its
  122.                      height in pixels.  If the -o option is supplied more than
  123.                      once, the last one applies.
  124.  
  125.         <sourcefile> is the name of the bmf source file.  It's name must not
  126.                      begin with a minus sign.
  127.  
  128.     bmfd [-o <sourcefile>] <name> <size>
  129.  
  130.         <sourcefile> is the name of the source file to be created (or
  131.                      overwritten).  If the -o option is not supplied, the name
  132.                      <name><size>.bmf will be used.  If the -o option is
  133.                      supplied more than once, the last one applies.
  134.  
  135.         <name>       is the name of the font.  Fonts:<name>.font must exist
  136.                      (unless the font is already in memory).
  137.  
  138.         <size>       is the size of the font (height in pixels), as a decimal
  139.                      integer.  Fonts:<name>/<size> must exist (unless the font
  140.                      is already in memory).
  141.  
  142.  
  143. ABOUT AMIGA BITMAP FONTS
  144.  
  145.     An Amiga bitmap font, if it resides on disk, is a load file (i.e. a file
  146.     that can be loaded directly into memory by the system function LoadSeg())
  147.     inside a subdirectory of Fonts: .  For example, the font Lucid 10 is the
  148.     load file "Fonts:Lucid/10".  For a font to be usable, there must be a .font
  149.     file in Fonts: whose name, minus the .font extension, is equal to the name
  150.     of the subdirectory.  For example, to use Lucid 10, there must be the file
  151.     "Fonts:Lucid.font".  The .font file describes the contents of the
  152.     subdirectory.  The program FixFonts, which comes with the Amiga operating
  153.     system, will create or update all of the .font files.
  154.  
  155.     A font consists of glyphs, which are rectangular arrays of pixels.  All
  156.     glyphs in a font have the same height, but needn't have the same width.
  157.     A font may define up to 256 glyphs, numbered 0 through 255, plus one
  158.     default glyph, which is used in place of undefined glyphs.
  159.  
  160.     A font may be a color font, in which case each pixel may have a specific
  161.     color defined by the designer, or a non-color font, whose pixels are just
  162.     on or off.
  163.  
  164.     A font may be a proportional font, in which case the "pen" moves over by
  165.     the width of the glyph in the process of drawing the glyph, or a non-
  166.     proportional font, in which case the pen always moves over by a fixed
  167.     amount regardless of the width of the glyph.
  168.  
  169.     When the system draws glyphs, it may be able to algorithmically bold,
  170.     italicize, or underline them, depending on whether the font grants
  171.     permission for these alterations.
  172.  
  173.     For more details about Amiga bitmap fonts, see the Rom Kernal Reference
  174.     Manual Libraries, or see what you can glean from the SOURCE LANGUAGE and
  175.     TECHNICAL NOTES sections of this doc file.
  176.  
  177.  
  178. SOURCE LANGUAGE
  179.  
  180.     The source language is called BMF.
  181.  
  182. Basic Syntax
  183.  
  184.     In BMF, there are 6 classes of
  185.     characters:
  186.  
  187.       class                  members
  188.       ---------------------  -------------------------
  189.       escape                 \
  190.       begin-comment          {
  191.       end-comment            }
  192.       instruction-separator  ;
  193.  
  194.       blank                  space, formfeed, newline,
  195.                              carriage return, tab,
  196.                              vertical tab
  197.  
  198.       regular                anything else
  199.  
  200.     Note that every character belongs to exactly one class.
  201.  
  202.     An escape causes the next character to be treated as a regular, even if it
  203.     normally isn't.
  204.  
  205.     Comments begin with a begin-comment and end with an end-comment.  Comments
  206.     may be nested.  Comments are skipped; that is, they do not become part of
  207.     instructions or words (see below).  Escapes take precedence over begin- and
  208.     end-comments, so in the sequence "{\}", the escape is not commented out;
  209.     rather, the end-comment is escaped.
  210.  
  211.     Instructions are separated by instruction-separators.  Instructions may
  212.     have length 0, so the sequence "a;;b" contains 3 instructions. Comments
  213.     take precedence over instruction-separators, so in the sequence "{;}", the
  214.     instruction-separator doesn't actually separate instructions, because the
  215.     entire comment is skipped.
  216.  
  217.     Within an instruction, words are separated by blanks.  Words may not have
  218.     length 0, so the sequence "a   b" contains only 2 words.  Comments take
  219.     precedence over blanks, so in the sequence "a{   }b", there is only one
  220.     word, namely "ab".
  221.  
  222.     To make sure you understand the syntax, see if you agree that the file
  223.  
  224.     a\;b{c
  225.     d{e}f\}
  226.     g}h;\i
  227.     j\\k
  228.  
  229.     contains two instructions, the first containing the single word "a;bh", the
  230.     second containing the two words "i" and "j\k".
  231.  
  232.     Note that it is an error for the source file to end with an escape, or to
  233.     end inside a comment.
  234.  
  235.     If a word consists of one or more decimal digits (0-9), or consists of a
  236.     dollar sign ($) followed by one or more hex digits (0-9, A-F, a-f), or
  237.     consists of a percent sign (%) followed by one or more binary digits (0-1),
  238.     then it represents an integer (it should be obvious which one!).  Only
  239.     integers in the range [0,4294967295] are allowed.
  240.  
  241. Instructions
  242.  
  243.     We now know what counts as an instruction syntactically, but only certain
  244.     instructions are actually acceptable.  In the descriptions that follow,
  245.     whenever it is said that a word must be in a range [a,b], it is implied
  246.     that the word must represent an integer.
  247.  
  248.     Most instructions are not required, most may appear no more than once, and
  249.     for most, it does not matter where in the source file they appear.  All
  250.     exceptions to these norms will be explicitly stated.
  251.  
  252.         The empty instruction, which contains no words, does nothing, but is
  253.         acceptable.
  254.  
  255.     bitmapfont <name> <ysize>
  256.  
  257.         This must be the first instruction in the source file.  <name> will be
  258.         used to fill in the fontname in the load file, and will be truncated to
  259.         32 characters if necessary.  Since the fontname will be overwritten
  260.         with the name of the .font file when the file is loaded, <name> is not
  261.         really important, except to help humans looking at the load file to
  262.         identify it.  <ysize> is the height of the font in pixels, i.e., the
  263.         number of rows in each glyph.  It must be in the range [1,65535].
  264.  
  265.     xydpi <xdpi> <ydpi>
  266.  
  267.         Causes a TA_DeviceDPI tag to be associated with the font.  <xdpi> and
  268.         <ydpi> describe the aspect ratio of the output device for which the
  269.         font was designed.  The individual values are not important, only the
  270.         ratio.  Both must be in the range [1,32767].
  271.  
  272.     colors <n> <color#0> <color#1> ... <color#(n-1)>
  273.  
  274.         The number of words in this instruction is determined by the value of
  275.         <n>, which must be in the range [0,256].  This instruction defines the
  276.         colors for a color font.  Each <color#i> must be in the range
  277.         [$000,$FFF], and represents a 4 bit/gun RGB color of the form $RGB.
  278.  
  279.     colorsym <symbol> <n>
  280.  
  281.         The character <symbol>, which must be a one-character word, is mapped
  282.         to color #<n>.  The map affects the way the glyph instruction is
  283.         interpreted (see below).  The colorsym instruction may appear any
  284.         numbers of times, and its placement is significant.  Each instance of
  285.         the instruction modifies the current map, and each glyph instruction is
  286.         interpreted using the current map at that point in the source file.
  287.         Before any colorsym instructions are encountered, the map looks like
  288.         this:
  289.  
  290.             characters  color number
  291.             ----------  ------------
  292.             @#*1         1
  293.             2            2
  294.             3            3
  295.             4            4
  296.             5            5
  297.             6            6
  298.             7            7
  299.             8            8
  300.             9            9
  301.             Aa          10
  302.             Bb          11
  303.             Cc          12
  304.             Dd          13
  305.             Ee          14
  306.             Ff          15
  307.  
  308.             (All other characters are mapped to color number 0)
  309.  
  310.         <n> must be in the range [0,255].
  311.  
  312.     glyph <b> <e> <glyph#b,row#0> <glyph#(b+1),row#0> ... <glyph#e,row#0>
  313.                   <glyph#b,row#1> <glyph#(b+1),row#1> ... <glyph#e,row#1>
  314.                   ...
  315.  
  316.         The number of words in this instruction is determined by the values of
  317.         <b> and <e>, each of which must be in the range [0,256], with
  318.         <b> <= <e>, and by the value of <ysize> from the bitmapfont
  319.         instruction.  The number of words following <e> is
  320.  
  321.             (<e> - <b> + 1) * <ysize>
  322.  
  323.         Each word defines one row of one glyph, as hinted by the choice of word
  324.         names above.  All the words pertaining to a particular glyph must have
  325.         the same length.  Each character in the word is mapped to a color
  326.         number according to the current map (see the colorsym instruction), and
  327.         defines one pixel of the glyph.  A non-color font may use only color
  328.         numbers 0 and 1.  A color font may use only color numbers 0 through
  329.         2^depth - 1 (see the depth parameter, below).
  330.  
  331.         The order of the words is intended to allow the source file to contain
  332.         the appearances of the defined glyphs.  For example:
  333.  
  334.             glyph 65 66
  335.  
  336.             __#___ ####__
  337.             _#_#__ #___#_
  338.             #___#_ #___#_
  339.             #___#_ ####__
  340.             #####_ #___#_
  341.             #___#_ #___#_
  342.             #___#_ ####__
  343.             ______ ______
  344.  
  345.             ;
  346.  
  347.         The glyph instruction may appear more than once, but the same glyph may
  348.         not be defined more than once.  Glyph 256 is the default glyph, used
  349.         for all undefined glyphs (even if there are none), so glyph 256 must
  350.         be defined.  Also, at least one of the glyphs 0-255 must be defined.
  351.  
  352.     nullglyph <b> <e>
  353.  
  354.         This instruction defines glyphs <b> through <e> to be zero-width
  355.         glyphs.  <b> and <e> must be in the range [0,256], with <b> <= <e>.
  356.         This instruction may appear more than once, but no glyph may be defined
  357.         more than once.  This instruction is provided because Amiga bitmap
  358.         fonts allow zero-width glyphs, but the glyph instruction doesn't.  I
  359.         can't imagine why anyone would want such glyphs, but the possibility is
  360.         here.
  361.  
  362.     The remaining instructions are all assignments.  An assignment sets the
  363.     value of a parameter. The form of an assignment is
  364.  
  365.     <parameter> <value>
  366.  
  367.     Each parameter may be assigned no more than once. Parameters that are not
  368.     assigned receive default values.  Descriptions of all parameters follow, in
  369.     the form
  370.  
  371.     <parameter>  <default>  <range>
  372.         <description>
  373.  
  374.     If the <default> or <range> is a function rather than a constant, it will
  375.     be replaced by an asterisk, and described in the <description>.
  376.  
  377.     antialias  0  [0,1]
  378.         If 1, indicates something about the colors defined by the colors
  379.         instruction.  I'm not sure what.  This instruction sets a flag which
  380.         is defined in graphics/text.h, but which is not mentioned in
  381.         RKM Libraries.  Unused in a non-color font.
  382.  
  383.     baseline  *  *
  384.         Defaults to <ysize> - 2, or 0 if <ysize> is 1, where <ysize> is from
  385.         the bitmapfont instruction.  Range [0, <ysize> - 1].  If the rows of a
  386.         glyph are numbered starting with 0 at the top, then row baseline+1 is
  387.         the one that gets set when the font is algorithmically underlined.
  388.  
  389.     bold  0  [0,1]
  390.         If 1, indicates that the font is already bold, and may not be
  391.         algorithmically bolded.
  392.  
  393.     boldsmear  1  [0,65535]
  394.         The number of pixels to the right to re-render the glyph when
  395.         algorithmically bolding.
  396.  
  397.     colorfont  0  [0,1]
  398.         If 1, indicates that the font is a color font.
  399.  
  400.     depth  1  [1,8]
  401.         Specifies the number of bitplanes for a color font.  Unused for a
  402.         non-color font.
  403.  
  404.     extended  0  [0,1]
  405.         If 1, indicates that the font is extended.
  406.  
  407.     fgcolor  255  [0,255]
  408.         Specifies which color number should be replaced by the foreground
  409.         color.  255 means no color should be replaced.  Unused for a non-color
  410.         font.
  411.  
  412.     greyfont  0  [0,1]
  413.         If 1, indicates that the colors defined by the colors instruction are
  414.         intended to be even-stepped greyshades.  Unused for a non-color font.
  415.  
  416.     high  *  *
  417.         Defaults to 2^depth - 1 (see parameter depth).  Range
  418.         [low, 2^depth - 1] (see parameter low).  Specifies the greatest color
  419.         number used by this font.  Unused for non-color fonts.
  420.  
  421.     italic  0  [0,1]
  422.         If 1, indicates that the font is already italic, and may not be
  423.         algorithmically italicized.
  424.  
  425.     low  0  *
  426.         Specifies the least color number used by the font.  Range
  427.         [0, 2^depth - 1] (see parameter depth).  Unused for non-color fonts.
  428.  
  429.     planeonoff  0  [0,255]
  430.         Specifies that a background plane which doesn't receive glyph data
  431.         should be set, if the corresponding bit in planeonoff is 1, or cleared,
  432.         if the corresponding bit in planeonoff is 0.  Unused for non-color
  433.         fonts.
  434.  
  435.     planepick  255  [0,255]
  436.         Chooses into which planes of the background to render the planes of the
  437.         glyphs.  Plane 0 of the glyphs is rendered into the background plane
  438.         corresponding to the least significant 1-bit in planepick.  Plane 1 of
  439.         the glyphs is rendered into the background plane corresponding to the
  440.         next more significant 1-bit of planepick, and so on.  Unused for
  441.         non-color fonts.
  442.         
  443.     proportional  *  [0,1]
  444.         Defaults to 1 unless all defined glyphs have the same width, in which
  445.         case it defaults to 0.  If 0, indicates that the actual widths of the
  446.         glyphs should be ignored, and xsize used instead for positioning the
  447.         glyphs (see parameter xsize).
  448.  
  449.     returncode  100  [0,127]
  450.         The returncode if the load file is executed.
  451.  
  452.     revision  0  [0,65535]
  453.         The revision number of the font.
  454.  
  455.     revpath  0  [0,1]
  456.         If 0, the font goes from left to right.  If 1, the font goes from right
  457.         to left.
  458.  
  459.     talldot  0  [0,1]
  460.         If 1, indicates that the font was designed for a high resolution
  461.         non-interlaced screen.
  462.  
  463.     underlined  0  [0,1]
  464.         If 1, indicates that the font is already underlined and may not be
  465.         algorithmically underlined.
  466.  
  467.     widedot  0  [0,1]
  468.         If 1, indicates that the font was designed for a low resolution
  469.         interlaced screen.
  470.  
  471.     xsize  *  [0,65535]
  472.         Defaults to the maximum width of all the defined glyphs.  For a non-
  473.         proportional font, the actual width of each glyph (which may not equal
  474.         xsize) is ignored, and this value used instead for positioning glyphs.
  475.         This value is also used by the console.device when reading keyboard
  476.         input, even for proportional fonts.
  477.  
  478.     You may have noticed that the descriptions of the parameters greyfont, low,
  479.     high, planepick, and planeonoff were rather vague.  That's because I don't
  480.     fully understand them myself.
  481.  
  482.  
  483. TECHNICAL NOTES
  484.  
  485.     The origin of each field of the struct DiskFontHeader is described below:
  486.  
  487.     dfh_NextSegment is not actually part of the struct DiskFontHeader, and is
  488.         not even contained in the load file; it is supplied by LoadSeg().
  489.  
  490.     dfh_ReturnCode is $70xx4E75, where the xx is filled in with returncode.
  491.         This is not actually part of the struct DiskFontHeader, but appears at
  492.         the start of the code hunk in the load file.  It is the 68000 machine
  493.         code for:
  494.         MOVEQ #$xx,D0
  495.         RTS
  496.  
  497.     dfh_DF.ln_Succ is 0, but will be overwritten when the font is loaded.
  498.  
  499.     dfh_DF.ln_Pred is 0, but will be overwritten when the font is loaded.
  500.  
  501.     dfh_DF.ln_Type is NT_FONT = 12.
  502.  
  503.     dfh_DF.ln_Pri is 0.
  504.  
  505.     dfh_DF.ln_Name points to dfh_Name.
  506.  
  507.     dfh_FileID is DFH_ID = $0F80.
  508.  
  509.     dfh_Revision is revision.
  510.  
  511.     dfh_Segment is 0, but will be overwritten when loaded. This is also called
  512.         dfh_TagList.  Someone please give me a clue here.  See the BUGS
  513.         section.
  514.  
  515.     dfh_Name is <name> from the bitmapfont instruction, padded with 0's or
  516.         truncated to 32 bytes.  It will be overwritten when the font is loaded.
  517.  
  518.     dfh_TF.tf_Message.mn_Node is a copy of dfh_DF.
  519.  
  520.     dfh_TF.tf_Message.mn_ReplyPort is 0, but will be overwritten when the font
  521.         is loaded.  It is also called dfh_TF.tf_Extension.  Someone please give
  522.         me a clue here.  See the BUGS section.
  523.  
  524.     dfh_TF.tf_Message.mn_Length is 0.  It's reserved, so I don't know what will
  525.         become of it when the font is loaded.
  526.  
  527.     dfh_TF.tf_YSize is <ysize> from the bitmapfont instruction.
  528.  
  529.     dfh_TF.tf_Style is
  530.         FSF_UNDERLINED * underlined + FSF_BOLD * bold + FSF_ITALIC * italic +
  531.         FSF_EXTENDED * extended + FSF_COLORFONT * colorfont
  532.         = underlined + 2 * bold + 4 * italic + 8 * extended + 64 * colorfont
  533.  
  534.     dfh_TF.tf_Flags is
  535.         FPF_DISKFONT + FPF_REVPATH * revpath + FPF_TALLDOT * talldot +
  536.         FPF_WIDEDOT * widedot + FPF_PROPORTIONAL * proportional + FPF_DESIGNED
  537.         = 2 + 4 * revpath + 8 * talldot + 16 * widedot + 32 * proportional + 64
  538.  
  539.     dfh_TF.tf_XSize is xsize.
  540.  
  541.     dfh_TF.tf_Baseline is baseline.
  542.  
  543.     dfh_TF.tf_Boldsmear is boldsmear.
  544.  
  545.     dfh_TF.tf_Accessors is 0, but will be overwritten after the font is loaded.
  546.  
  547.     dfh_TF.tf_LowChar is the least defined glyph number.
  548.  
  549.     dfh_TF.tf_HighChar is the greatest defined glyph number other than 256.
  550.  
  551.     dfh_TF.tf_CharData points to the bitplane containing the defined glyphs, in
  552.         order, stripped of blank columns on their sides.  The bitplane is
  553.         padded on the right with blank columns to bring its width up to a
  554.         multiple of 16.  A blank column is one whose pixels are all color #0.
  555.  
  556.     dfh_TF.tf_Modulo is the number of bytes in each row of the bitplane.
  557.  
  558.     dfh_TF.tf_CharLoc points to an array of pairs of UWORDs, one pair for each
  559.         glyph from tf_LowChar through tf_HighChar, plus one pair for glyph 256.
  560.         The first word of each pair is the horizontal offset into tf_CharData
  561.         at which the corresponding glyph starts.  The second word of each pair
  562.         is the width of the glyph, after being stripped of blank columns on its
  563.         sides.
  564.  
  565.     dfh_TF.tf_CharSpace and dfh_TF.tf_CharKern:
  566.         Each points an array of WORDs, one WORD for each glyph from tf_LowChar
  567.         through tf_HighChar, plus one WORD for glyph 256. For each glyph, let A
  568.         be the number of blank columns on the left side, let C be the number of
  569.         blank columns on the right side, and let B be the number of columns
  570.         remaining in the middle.  If all columns are blank, then A = B = 0, and
  571.         C = the total number of columns. B is the width of the glyph in the
  572.         bitmap.  For a forward path font, the tf_CharKern value is A and the
  573.         tf_CharSpace value is B+C.  For a reverse path font, the tf_CharKern
  574.         value is -B - C, and the tf_CharSpace value is -A.
  575.  
  576.     If the font is a color font, there are additional fields:
  577.  
  578.     dfh_TF.ctf_Flags is CT_COLORFONT * <c> + CT_GREYFONT * greyfont +
  579.         CT_ANTIALIAS * antialias
  580.         = <c> + 2 * greyfont + 4 * antialias
  581.         where <c> is 1 if the colors instruction appeared in the source, and 0
  582.         if it didn't.
  583.  
  584.     dfh_TF.ctf_Depth is depth.
  585.  
  586.     dfh_TF.ctf_FgColor is fgcolor.
  587.  
  588.     dfh_TF.ctf_Low is low.
  589.  
  590.     dfh_TF.ctf_High is high.
  591.  
  592.     dfh_TF.ctf_PlanePick is planepick.
  593.  
  594.     dfh_TF.ctf_PlaneOnOff is planeonoff.
  595.  
  596.     dfh_TF.ctf_ColorFontColors->cfc_Reserved is 0.
  597.  
  598.     dfh_TF.ctf_ColorFontColors->cfc_Count is <n> from the colors instruction,
  599.         or 0 if there was no colors instruction.
  600.  
  601.     dfh_TF.ctf_ColorFontColors->cfc_ColorTable is 0 if cfc_Count is 0,
  602.         otherwise it points to an array of cfc_Count UWORDs containing the
  603.         <color#i> values from the colors instruction.
  604.  
  605.     dfh_TF.ctf_CharData is an array of 8 pointers.  The first depth pointers
  606.         point to the individual bitplanes in dfh_TF.tf_CharData ("depth" is a
  607.         number, not an adjective!).  The remaining pointers are 0.
  608.  
  609.  
  610. BUGS
  611.  
  612.     The xydpi instruction doesn't actually cause a TA_DeviceDPI tag to be
  613.     put into the load file because I don't know whether to use dfh_TagList or
  614.     dfh_TF.tf_Extension or both, or if I'm even allowed to put tags into the
  615.     load file (maybe they only appear in the .font file).  Someone please give
  616.     me a clue here, because the RKMs are not clear on this.
  617.  
  618.     There are certainly other bugs waiting to be discovered (after all, this is
  619.     only version 0.00).  I do intend to fix them, but please help me find them.
  620.  
  621.     Send all bug reports and suggestions to the email address
  622.  
  623.         amc@cics.wustl.edu
  624.  
  625.     or to the United States postal address
  626.  
  627.         Adam Costello
  628.         6515 Wydown Blvd. #4240
  629.         St. Louis, MO 63105
  630.  
  631.     Note that both addresses may change in August 1993.
  632.